package com.abc.xxx.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.abc.xxx.constants.DataScopes;
import com.abc.xxx.dao.UserMapper;
import com.abc.xxx.model.User;
import com.abc.xxx.model.vo.UserInfo;
import com.abc.xxx.service.AccessibleDeptService;
import com.abc.xxx.service.AccessibleViewService;
import com.abc.xxx.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toMap;
import static org.apache.commons.lang3.BooleanUtils.isTrue;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private AccessibleViewService accessibleViewService;
    @Autowired
    private AccessibleDeptService accessibleDeptService;

    @Override
    public User findUserByName(String name) {
        User user = baseMapper.findUserByName(name);
        fixRootUserData(user);
        return user;
    }

    @Override
    public UserInfo findUserInfoForLoginedUser(Integer loginedUserId) {
        UserInfo userInfo = baseMapper.findUserInfoById(loginedUserId);
        fixRootUserInfoData(userInfo);
        List<String> accessibleViews = accessibleViewService.findRoleAccessibleViews(userInfo.getRoleId());
        userInfo.setAccessibleViews(accessibleViews);
        if (DataScopes.CUSTOM_DEPT_DATA.equals(userInfo.getDataScope())){
            List<Integer> customAccessibleDepts = accessibleDeptService.findDeptIdsByRoleId(userInfo.getRoleId());
            userInfo.setCustomAccessibleDepts(customAccessibleDepts);
        }
        return userInfo;
    }

    @Override
    public List<String> findUserNickUsingTheRole(Integer roleId) {
        QueryWrapper<User> w = new QueryWrapper<>();
        w.select("nick");
        w.eq("role_id",roleId);
        return list(w).stream().map(User::getNick).collect(Collectors.toList());
    }

    @Override
    public List<User> findUsers(Integer currentUserId, String key) {
        Objects.requireNonNull(currentUserId, "当前登录用户id不能为空");
        return baseMapper.findUsers(currentUserId, key);
    }

    @Override
    public boolean isAccountExists(String name) {
        QueryWrapper<User> w = new QueryWrapper<>();
        w.eq("name", name);
        return retBool(count(w));
    }

    @Override
    public boolean isUserNameDuplicate(Integer userId, String userName) {
        QueryWrapper<User> w = new QueryWrapper<>();
        w.ne("id",userId);
        w.eq("name", userName);
        return retBool(count(w));
    }

    @Override
    public void assignRoleToUser(Integer userId, String roleName) {
        UpdateWrapper<User> w = new UpdateWrapper<>();
        w.eq("id", userId);
        w.set("role_name", roleName);
        update(w);
    }

    @Override
    public Map<Integer, String> loadUserNameMap(Set<Integer> userIds) {
        QueryWrapper<User> q = new QueryWrapper<>();
        q.select("`id`,`nick`,`name`");
        q.in("`id`",userIds);
        return list(q).stream().collect(toMap(User::getId,u->{
            String nick = u.getNick();
            String name = u.getName();
            if(isNotBlank(nick)){
                return nick;
            }else{
                return name;
            }
        }));
    }

    private void fixRootUserData(User user){
        // 修正超级管理员的一些数据
        if (user.root()) {
            // 数据权限。1：全部（不做任何限制） 2：本人的数据 3.本部门 4.本部门及下级部门 5：自定义数据权限（查t_data_permission子表）
            user.setDataScope(1);
            user.setRoleName("超级管理员");
            if (isBlank(user.getDeptName())) {
                user.setDeptName("无");
            }
        }
    }
    private void fixRootUserInfoData(UserInfo user){
        // 修正超级管理员的一些数据
        if (isTrue(user.getRoot())) {
            // 数据权限。1：全部（不做任何限制） 2：本人的数据 3.本部门 4.本部门及下级部门 5：自定义数据权限（查t_data_permission子表）
            user.setDataScope(1);
            user.setRoleName("超级管理员");
            if (isBlank(user.getDeptName())) {
                user.setDeptName("无");
            }
        }
    }


}
